package main

import (
	"fmt"
)

/**
执行用时：4 ms, 在所有 Go 提交中击败了52.90%的用户
内存消耗：2.2 MB, 在所有 Go 提交中击败了74.91%的用户
 */

const INT_MAX = 1<<31 - 1
const INT_MIN = -(1 << 31)

func myAtoi(s string) int {
	k := 0
	for k < len(s) && s[k] == ' ' {
		k++
	}
	if k == len(s) {
		return 0
	}

	minus := 1
	if s[k] == '-' {
		minus = -1
		k++
	} else if s[k] == '+' {
		k++
	}

	res := 0
	for k < len(s) && s[k] >= '0' && s[k] <= '9' {
		x := int(s[k] - '0')
		if minus > 0 && res > (INT_MAX - x) / 10 {
			return INT_MAX
		}
		if minus < 0 && -res < (INT_MIN + x) / 10 {
			return INT_MIN
		}
		res = res * 10 + x
		k++
	}
	if minus == -1 {
		res *= -1
	}
	return res
}

func main() {
	fmt.Println(myAtoi("42"))  // 42
	fmt.Println(myAtoi("  -42"))  // -42
	fmt.Println(myAtoi("4193 with words"))  // 4193
	fmt.Println(myAtoi("9223372036854775808"))  // 2147483647
}
